#pragma once
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

class Staff {
public:
    int m_Id; // 编号
    string m_Name; // 姓名
    int m_Deid; // 部门编号
    string m_Position; // 岗位
    virtual void displayDuty() {
        cout << "职责：" << "完成经理交给的任务" << endl;
    }
    void displayAll() {
        cout << "编号：" << m_Id << endl;
        cout << "姓名：" << m_Name << endl;
        cout << "部门编号：" << m_Deid << endl;
        cout << "岗位：" << m_Position << endl;
        displayDuty();
    }
    Staff() {}
    Staff(int id,string name,int deid) {
        m_Id = id;
        m_Name = name;
        m_Deid = deid;
        m_Position = "普通职工";
    }
};
class StaffNode {
public:
    static StaffNode * p;
    Staff * m_Staff;
    StaffNode * next;
    ~StaffNode() {
        if(m_Staff != nullptr) {
            delete m_Staff;
            m_Staff = nullptr;
        }
    }
};
class Manager : public Staff {
public:
    void displayDuty() {
        cout << "职责：" << "完成老板交给的任务，并下发任务给员工" << endl;
    }
    Manager(int id,string name,int deid) {
        m_Id = id;
        m_Name = name;
        m_Deid = deid;
        m_Position = "经理";
    }
};
class Boss : public Staff {
public:
    void displayDuty() {
        cout << "职责：" << "管理公司所有任务" << endl;
    }
    Boss(int id,string name,int deid) {
        m_Id = id;
        m_Name = name;
        m_Deid = deid;
        m_Position = "老板";
    }
};

void displayMenu(); // 展示目录
void readFile(StaffNode * &p); // 读取文件数据
ofstream & operator<<(ofstream &ofs,Staff * s); // 重载<<运算符
void displayStaff(StaffNode * &p); // 显示所有职工信息
void addaStaff(StaffNode * &i); // 添加一个职工
void updateFile(StaffNode * &p); // 更新文件
void addStaffs(StaffNode * &p); // 批量添加职工信息，并录入文件中
void deleteStaff(StaffNode * &p); // 按照编号删除员工信息
void modifyStaff(StaffNode * &p); // 按照编号修改员工信息
void searchStaff1(StaffNode * &p); // 按照编号查找员工信息
void searchStaff2(StaffNode * &p); // 按照名字查找员工信息
void deleteAll(StaffNode * &p); // 清空文件所有信息
void sortStaff(StaffNode * &p); // 按编号指定方式排序



  